home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / ASM / EMS.ASM < prev    next >
Assembly Source File  |  2000-09-29  |  10KB  |  572 lines

  1. code   segment
  2.  
  3.  assume cs:code,ds:code,es:code,ss:code
  4.  org 0
  5.  
  6. befehl    equ 2
  7. status    equ 3
  8. end_adr   equ 14
  9.  
  10. cmd       equ 16384
  11. arg1      equ cmd+0
  12. arg2      equ cmd+2
  13. arg3      equ cmd+4
  14. arg4      equ cmd+6
  15. arg5      equ cmd+8
  16. arg6      equ cmd+10
  17. arg7      equ cmd+12
  18. arg8      equ cmd+14
  19.  
  20. reg_bp    equ 22
  21. reg_sp    equ 20
  22. reg_ss    equ 18
  23. reg_cs    equ 16
  24. reg_es    equ 14
  25. reg_di    equ 12
  26. reg_ds    equ 10
  27. reg_si    equ 8
  28. reg_dx    equ 6
  29. reg_cx    equ 4
  30. reg_bx    equ 2
  31. reg_ax    equ 0
  32.  
  33. reg_dl    equ 6
  34. reg_cl    equ 4
  35. reg_bl    equ 2
  36. reg_al    equ 0
  37.  
  38. reg_dh    equ 7
  39. reg_ch    equ 5
  40. reg_bh    equ 3
  41. reg_ah    equ 1
  42.  
  43. erst_b    equ this byte
  44.  
  45.  
  46. emstreiber:
  47.          dw -1,-1             ; DOS-Intern
  48.          db 0,80h             ; Flags
  49. soffset  dw offset strat      ; Strategie-Routine
  50. ioffset  dw offset intr       ; Interrupt-Routine
  51.          db "EMMXXXX0"        ; EMS-Kennung
  52.  
  53.  
  54. frame_seg   dw (?)
  55. janus_ofs   dw (?)
  56. db_ptr      dw (?),(?)
  57.  
  58.  
  59.  ; ************ Strategie-Routine des Treibers
  60. strat  proc far
  61.  mov cs:db_ptr,bx
  62.  mov cs:db_ptr+2,es
  63.  ret
  64. start  endp
  65.  
  66.  
  67.  ; ************ Treiber-Interrupt nach Installation
  68. newint  proc far
  69.  pushf
  70.  push es
  71.  push di
  72.  les di,dword ptr db_ptr
  73.  mov w[di+3],0100
  74.  pop di
  75.  pop es
  76.  popf
  77.  ret
  78. nerint  endp
  79.  
  80.  
  81.  ; ************ EMS/LIM 4.0-Interrupt fr Vektor $67
  82. emsint  proc far
  83.  push bp
  84.  push sp
  85.  push ss
  86.  push cs
  87.  push es
  88.  push di
  89.  push ds
  90.  push si
  91.  push dx
  92.  push cx
  93.  push bx
  94.  push ax
  95.  
  96.  mov bp,sp
  97.  push cs
  98.  pop ds
  99.  mov di,janus_ofs
  100.  
  101. test40:                      ; EMS-Status ermitteln
  102.  cmp ah,040
  103.  jne test41
  104.  mov b[bp+reg_ah],0
  105.  jmp near okay
  106.  
  107. test41:                      ; Segment des PageFrames
  108.  cmp ah,041
  109.  jne test42
  110.  mov b[bp+reg_ah],0
  111.  mov w[bp+reg_bx],frame_seg
  112.  jmp near okay
  113.  
  114. test42:                      ; Anzahl der EMS-Pages
  115.  cmp ah,042
  116.  jne test43
  117.  mov es,0d400
  118.  mov es:w[di+arg1],042
  119.  call near call_and_wait
  120.  mov es,0d400
  121.  mov b[bp+reg_ah],0
  122.  mov w[bp+reg_bx],es:[di+arg2]
  123.  mov w[bp+reg_dx],es:[di+arg3]
  124.  jmp near okay
  125.  
  126. test43:                      ; EMS-Speicher belegen
  127.  cmp ah,043
  128.  jne test44
  129.  mov es,0d400
  130.  mov es:w[di+arg1],043
  131.  mov es:w[di+arg2],bx
  132.  call near call_and_wait
  133.  mov es,0d400
  134.  mov w[bp+reg_ax],es:[di+arg2]
  135.  mov w[bp+reg_dx],es:[di+arg3]
  136.  jmp near okay
  137.  
  138. test44:                      ; Mapping setzen
  139.  cmp ah,044
  140.  jne test45
  141.  
  142.  cmp al,0
  143.  jne bad_page
  144.  mov es,0d400
  145.  mov es:w[di+arg1],044
  146.  mov es:w[di+arg2],bx
  147.  mov es:w[di+arg3],dx
  148.  call near call_and_wait
  149.  mov b[bp+reg_ah],0
  150.  jmp near okay
  151.  
  152. bad_page:
  153.  mov b[bp+reg_ah],08b
  154.  jmp near okay
  155.  
  156. test45:                      ; EMS-Speicher freigeben
  157.  cmp ah,045
  158.  jne test46
  159.  mov es,0d400
  160.  mov es:w[di+arg1],045
  161.  mov es:w[di+arg2],dx
  162.  call near call_and_wait
  163.  mov b[bp+reg_ah],0
  164.  jmp near okay
  165.  
  166. test46:                      ; Version des EMS-Treibers ermitteln
  167.  cmp ah,046
  168.  jne test47
  169.  mov b[bp+reg_ah],0
  170.  mov b[bp+reg_al],01000000b
  171.  jmp near okay
  172.  
  173. test47:                      ; Seitentabelle sichern
  174.  cmp ah,047
  175.  jne test48
  176.  mov es,0d400
  177.  mov es:w[di+arg1],047
  178.  mov es:w[di+arg2],dx
  179.  call near call_and_wait
  180.  mov b[bp+reg_ah],0
  181.  jmp near okay
  182.  
  183. test48:                      ; Mapping zurcksetzen
  184.  cmp ah,048
  185.  je mapping
  186.  jmp near test4B
  187.  
  188. mapping:
  189.  mov es,0d400
  190.  mov es:w[di+arg1],048
  191.  mov es:w[di+arg2],dx
  192.  call near call_and_wait
  193.  mov b[bp+reg_ah],0
  194.  jmp near okay
  195.  
  196.  ; 49 und 4A:  Interne Funktionen
  197.  
  198. test4B  label near           ; Anzahl der Handles ermitteln
  199.  cmp ah,04B
  200.  jne test4C
  201.  mov es,0d400
  202.  mov es:w[di+arg1],04b
  203.  call near call_and_wait
  204.  mov es,0d400
  205.  mov w[bp+reg_bx],es:[di+arg2]
  206.  mov b[bp+reg_ah],0
  207.  jmp near okay
  208.  
  209. test4C:                      ; Anzahl allokierter Pages ermitteln
  210.  cmp ah,04C
  211.  jne test4D
  212.  mov es,0d400
  213.  mov es:w[di+arg1],04c
  214.  mov es:w[di+arg2],dx
  215.  call near call_and_wait
  216.  mov es,0d400
  217.  mov w[bp+reg_bx],es:[di+arg2]
  218.  mov b[bp+reg_ah],0
  219.  jmp near okay
  220.  
  221. test4D:                      ; Alle Handles ermitteln
  222.  cmp ah,04D
  223.  jne test4E
  224.  mov ds,0d400
  225.  mov si,cs:janus_ofs
  226.  mov ds:w[si+arg1],04d
  227.  call near call_and_wait
  228.  mov w[bp+reg_bx],ds:w[di+arg2]
  229.  mov b[bp+reg_ah],0
  230.  mov es,w[bp+reg_es]
  231.  mov di,w[bp+reg_di]
  232.  mov cx,512
  233.  rep movsw
  234.  call near call_and_wait 
  235.  jmp near okay
  236.  
  237. test4E:
  238.  cmp ah,04E
  239.  je test4E_sub00
  240.  jmp near test4F
  241.  
  242. test4E_sub00:                ; HardPages sichern
  243.  cmp al,0
  244.  jne test4E_sub01
  245.  mov es,0d400
  246.  mov es:[di+arg1],04e00
  247.  call near call_and_wait
  248.  mov ds,0d400
  249.  mov si,janus_ofs
  250.  mov es,w[bp+reg_es]
  251.  mov di,w[bp+reg_di]
  252.  mov es:w[di+00],ds:w[si+arg2]
  253.  mov b[bp+reg_ah],0
  254.  jmp near okay
  255.  
  256. test4E_sub01:                ; HardPages restaurieren
  257.  cmp al,1
  258.  je is4E_sub01
  259.  jmp near test4E_sub02
  260. is4E_sub01:
  261.  mov ds,0d400
  262.  mov si,janus_ofs
  263.  mov es,w[bp+reg_es]
  264.  mov di,w[bp+reg_di]
  265.  mov ds:w[si+arg1],04e01
  266.  mov ds:w[si+arg2],es:w[di+00]
  267.  call near call_and_wait
  268.  mov b[bp+reg_ah],0
  269.  jmp near okay
  270.  
  271. test4E_sub02:                ; HardPages sichern und restaurieren
  272.  cmp al,2
  273.  jne test4E_sub03
  274.  mov ah,04e
  275.  mov al,0
  276.  mov es,w[bp+reg_es]
  277.  mov di,w[bp+reg_di]
  278.  int 67h
  279.  mov ah,04e
  280.  mov al,1
  281.  mov ds,w[bp+reg_ds]
  282.  mov si,w[bp+reg_si]
  283.  int 67h
  284.  jmp near okay
  285.  
  286. test4E_sub03:                ; Gr”áe fr Puffer ermitteln
  287.  cmp al,3
  288.  jne fehler4E_sub
  289.  mov b[bp+reg_al],4
  290.  mov b[bp+reg_ah],0
  291.  jmp near okay
  292.  
  293. fehler4E_sub:
  294.  mov b[bp+reg_ah],084
  295.  jmp near okay
  296.  
  297. test4F:
  298.  cmp ah,04f
  299.  jne test50
  300.  mov es,0d400
  301.  mov es:w[di+arg1],04f
  302.  call near call_and_wait
  303.  mov b[bp+reg_ah],0
  304.  jmp near okay
  305.  
  306. test50:
  307.  cmp ah,050
  308.  jne test51
  309.  mov es,0d400
  310.  mov es:w[di+arg1],050
  311.  call near call_and_wait
  312.  mov b[bp+reg_ah],0
  313.  jmp near okay
  314.  
  315. test51:
  316.  cmp ah,051
  317.  jne test52
  318.  mov es,0d400
  319.  mov es:w[di+arg1],051
  320.  mov es:w[di+arg2],dx
  321.  mov es:w[di+arg3],bx
  322.  call near call_and_wait
  323.  mov w[bp+reg_ax],es:w[di+arg2]
  324.  jmp near okay
  325.  
  326. test52:
  327.  cmp ah,052
  328.  jne test53
  329.  mov w[bp+reg_ax],0
  330.  jmp near okay
  331.  
  332. test53:
  333.  cmp ah,053
  334.  jne test54
  335.  mov es,0d400
  336.  mov es:w[di+arg1],053
  337.  call near call_and_wait
  338.  mov b[bp+reg_ah],087
  339.  jmp near okay
  340.  
  341. test54:
  342.  cmp ah,054
  343.  jne test55
  344.  mov es,0d400
  345.  mov es:w[di+arg1],054
  346.  call near call_and_wait
  347.  mov b[bp+reg_ah],087
  348.  jmp near okay
  349.  
  350. test55:
  351.  cmp ah,055
  352.  jne test56
  353.  mov es,0d400
  354.  mov es:w[di+arg1],055
  355.  call near call_and_wait
  356.  mov b[bp+reg_ah],087
  357.  jmp near okay
  358.  
  359. test56:
  360.  cmp ah,056
  361.  jne test57
  362.  mov es,0d400
  363.  mov es:w[di+arg1],056
  364.  call near call_and_wait
  365.  mov b[bp+reg_ah],087
  366.  jmp near okay
  367.  
  368. test57:
  369.  cmp ah,057
  370.  jne test58
  371.  mov es,0d400
  372.  mov es:w[di+arg1],057
  373.  call near call_and_wait
  374.  mov b[bp+reg_ah],087
  375.  jmp near okay
  376.  
  377. test58:
  378.  cmp ah,058
  379.  jne test59
  380.  cmp al,1
  381.  je test58_sub01
  382.  mov es,w[bp+reg_es]
  383.  mov di,w[bp+reg_di]
  384.  mov es:w[di+0],cs:frame_seg
  385.  mov es:w[di+2],0
  386. test58_sub01:
  387.  mov w[bp+reg_cx],1
  388.  mov b[bp+reg_ah],0
  389.  jmp near okay
  390.  
  391. test59:
  392.  cmp ah,059
  393.  jne test5A
  394.  mov es,0d400
  395.  mov es:w[di+arg1],059
  396.  call near call_and_wait
  397.  mov b[bp+reg_ah],087
  398.  jmp near okay
  399.  
  400. test5A:
  401.  cmp ah,05A
  402.  jne test5C
  403.  mov ah,043
  404.  int 67h
  405.  mov b[bp+reg_ah],ah
  406.  mov w[bp+reg_dx],dx
  407.  jmp near okay
  408.  
  409. test5C:
  410.  cmp ah,05c
  411.  jne fehler
  412.  mov b[bp+reg_ah],0
  413.  jmp near okay
  414.  
  415. fehler:
  416.  mov b[bp+reg_ah],084
  417.  
  418. okay:
  419.  pop ax
  420.  pop bx
  421.  pop cx
  422.  pop dx
  423.  pop si
  424.  pop ds
  425.  pop di
  426.  pop es
  427.  pop bp
  428.  pop bp
  429.  pop bp
  430.  pop bp
  431.  iret
  432. emsint  endp
  433.  
  434. call_and_wait  proc near
  435.  push ds
  436.  push es
  437.  mov ah,7
  438.  mov al,27
  439.  int 0b
  440.  mov ah,8
  441.  mov al,27
  442.  int 0b
  443.  pop es
  444.  pop ds
  445.  ret
  446. call_and_wait  endp
  447.  
  448. wait_amiga  proc near
  449.  push ds
  450.  push es
  451.  mov ah,8
  452.  mov al,27
  453.  int 0b
  454.  pop es
  455.  pop ds
  456.  ret
  457. wait_amiga  endp
  458.  
  459. pages  equ this byte
  460.  
  461.  ; ************ Interruptroutine des Treibers
  462. intr   proc far
  463.  push ax
  464.  push bx
  465.  push cx
  466.  push dx
  467.  push di
  468.  push si
  469.  push bp
  470.  push ds
  471.  push es
  472.  pushf
  473.  
  474.  push cs
  475.  pop ds
  476.  
  477.  les di,dword ptr db_ptr
  478.  mov bl,es:[di+befehl]
  479.  cmp bl,0
  480.  je bc_okay
  481.  
  482.  mov ax,8003h
  483.  jmp short intr_end
  484.  
  485. bc_okay:
  486.  call init
  487.  
  488. intr_end  label near
  489.  or ax,0100h
  490.  mov es:[di+status],ax
  491.  
  492.  popf
  493.  pop es
  494.  pop ds
  495.  pop bp
  496.  pop si
  497.  pop di
  498.  pop dx
  499.  pop cx
  500.  pop bx
  501.  pop ax
  502.  ret
  503. intr  endp
  504.  
  505.  
  506.  ; ************ Installationsroutine
  507. init   proc near
  508.  mov word ptr es:[di+end_adr],offset pages
  509.  mov word ptr es:[di+end_adr+2],cs
  510.  
  511.  mov dx,offset initm            ; Installationsmeldung ausgeben
  512.  mov ah,9
  513.  int 21h
  514.  
  515.  push di                        ; Verbindung zum Amiga herstellen
  516.  push es
  517.  push ds
  518.  mov ah,1
  519.  mov al,27
  520.  int 0b
  521.  cmp di,-1
  522.  je init_fehler
  523.  mov janus_ofs,di
  524.  pop ds
  525.  pop es
  526.  pop di
  527.  
  528.  mov ax,0d400
  529.  mov dx,cs:janus_ofs
  530.  mov cl,4
  531.  shr dx,cl
  532.  add ax,dx
  533.  mov frame_seg,ax
  534.  
  535.  mov ah,25h                     ; EMS-Interrupt einbinden
  536.  mov al,67h
  537.  mov dx,offset emsint
  538.  int 21h
  539.  
  540.  mov ioffset,offset newint      ; Neue Treiber-Interruptroutine erstellen
  541.  
  542.  mov dx,offset sokay            ; Treiber erfolgreich installiert
  543.  mov ah,9
  544.  int 21h
  545.  
  546.  xor ax,ax
  547. init_ende:
  548.  ret
  549.  
  550. init_fehler:
  551.  pop ds
  552.  pop es
  553.  pop di
  554.  mov dx,offset kserv
  555.  mov ah,9
  556.  int 21h
  557.  mov ax,1
  558.  mov word ptr es:[di+end_adr],offset emstreiber
  559.  mov word ptr es:[di+end_adr+2],cs
  560.  jmp near init_ende
  561. init  endp
  562.  
  563.  
  564.  ; ************ Installationsmeldungen beim Start
  565. initm db "ATUtilities EMS/LIM 4.0-Manager. Copyright (C) 1993 by Thomas Dreibholz",13,10,"$"
  566. sokay db "Treiber wurde erfolgreich installiert.",13,10,"$"
  567. kserv db "FEHLER: Amiga-Treiber ist nicht aktiv.",13,10
  568.       db "Treiber konnte nicht installiert werden.",13,10,10,"$"
  569.  
  570. code  ends
  571.  end
  572.